package com.gitee.deament.server.core.cli.db.set;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * SINTER key [key …]
 * 可用版本： >= 1.0.0
 * 时间复杂度: O(N * M)， N 为给定集合当中基数最小的集合， M 为给定集合的个数。
 * 返回一个集合的全部成员，该集合是所有给定集合的交集。
 *
 * 不存在的 key 被视为空集。
 *
 * 当给定集合当中有一个空集时，结果也为空集(根据集合运算定律)。
 *
 * 返回值
 * 交集成员的列表。
 * @author deament
 */
@CliHander(command = "SINTER")
public class SINTERcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> cliValues = getValues(command);
        if (cliValues.size() <2) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'SINTER' command"));
            return;
        }
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        DBData dbData = SystemConfig.dbData;

        Set<String> result= null;
        try {
            for (int i = 1; i < cliValues.size(); i++) {

                Value<Set<String>> set = dbData.getSet(db, cliValues.get(i));
                if(set==null){
                    channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(""));
                    return ;
                }
                if(result ==null){
                    result=(HashSet)((HashSet)set.getValue()).clone();
                }else{
                    result.retainAll(set.getValue());
                }


            }
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(result.toString()));
        }catch (Exception e){
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(e.getMessage()));
        }



    }





}
